/**
 * 公共插件
 * @author QiangJi on 2017/10/16
 */
(function($){
    var defaultDateFormatStr = 'YYYY/MM/DD HH:ii:ss';     //默认日期格式

    /**
     * 校验日期格式化字符是否合法
     * @param _format YYYY/MM/DD HH:ii:ss
     */
    function verifyFormatStr(_format){
        return 'undefined' === typeof _format || 'string' !== typeof _format ? defaultDateFormatStr : (function(_year, _month, _day, _hour, _minute, _second, _falseVal){
            return _falseVal != _year || _falseVal != _month || _falseVal != _day || _falseVal != _hour || _falseVal != _minute || _falseVal != _second ? _format : defaultDateFormatStr;
        })(_format.indexOf('YYYY'), _format.indexOf('MM'), _format.indexOf('DD'), _format.indexOf('HH'), _format.indexOf('ii'), _format.indexOf('ss'), -1);
    }

    //定义时间判断
    var _defineDate = {
        _second : 1000,                 //一秒
        _minute : 60 * 1000,             //一分种60秒
        _hour : 60 * 60 * 1000,         //一小时60分钟
        _day : 24 * 60 * 60 * 1000,     //一天24小时
        _current : function(){          //当前日期
            return new Date();
        },
        /**
         * 获取该时间段满月天数
         * @param _timestamp
         * @returns {number}
         */
        getFullMonthDay : function(_timestamp){
            var _date = new Date(_timestamp);
            return 'Invalid Date' == _date ? -1 : (function(_month, _year){
                if(_month == 2){
                    return _year % 4 == 0 ? 29 : 28;
                }else if($.inArray(_month, [1, 3, 5, 7, 8, 10, 12]) != -1){
                    return 31;
                }else{
                    return 30;
                }
            })(_date.getMonth() + 1, _date.getFullYear());
        },
        /**
         * 获取常量所在位置， 未查询到返回-1
         * @param val
         * @returns {number}
         */
        getFinalIndex : function(val){
            var _index = 0;
            for(var i in $.FORMAT_FINAL){
                if($.FORMAT_FINAL[i] == val){
                    return _index;
                }
                _index++;
            }
            return -1;
        },
        /**
         * 获取日期个性化 格式字符
         * @param _date     查询日期 时间戳
         * @param _limit   个性化范围
         * @returns {*}
         */
        getStringDate : function(_date, _limit){
            var _current = this._current(), _cha = _current.getTime() - _date.getTime(), _abs = Math.abs(_cha), _fullYears = 365, _month = this.getFullMonthDay(_current.getTime()), lastStr = _cha > 0 ? '前' : '后', _unit = '', _lastValue = '';

            //判断一年实际天数
            if(this.getFullMonthDay(new Date(_current.getFullYear() + '/2').getTime()) == 29){
                _fullYears = 366;
            }

            //大于一年，为XX年
            if(_fullYears * this._day < _abs){
                _unit = $.FORMAT_FINAL.YEAR;
                _lastValue = Math.floor(_abs / (_fullYears * this._day)) +  _unit + lastStr;
            }
            //大于月，为XX月
            else if(_abs > _month * this._day){
                _unit = $.FORMAT_FINAL.MONTH;
                _lastValue = Math.floor(_abs / (_month * this._day)) +  _unit + lastStr;
            }
            //大于一周，为XX周
            else if(this._day * 7 < _abs){
                _unit = $.FORMAT_FINAL.WEEK;
                _lastValue = Math.floor(_abs / this._day / 7) +  _unit + lastStr;
            }
            //大于一天，为XX天
            else if(this._day < _abs){
                _unit = $.FORMAT_FINAL.DAY;
                _lastValue = Math.floor(_abs / this._day) + _unit + lastStr;
            }
            //小于一天， 为XX小时
            if(this._day > _abs){
                _unit = $.FORMAT_FINAL.HOUR;
                _lastValue = Math.floor(_abs / this._hour) + _unit + lastStr;
            }
            //小于一小时，为XX分钟
            if(this._hour > _abs){
                _unit = $.FORMAT_FINAL.MINUTE;
                _lastValue = Math.floor(_abs / this._minute) +  _unit + lastStr;
            }
            //小于一分钟，为XX秒
            if(this._minute > _abs){
                _unit = $.FORMAT_FINAL.SECOND;
                _lastValue = Math.floor(_abs / this._second) + _unit + lastStr;
            }

            //如果超出范围，则返回格式化日期
            if(this.getFinalIndex(_unit) < this.getFinalIndex(_limit)){
                return -1;
            }
            return _lastValue;
        },
        /**
         * 正则替换
         * @param _reg
         * @param _string
         * @param _value
         */
        replaceStr : function(_reg, _string, _value){
            if('string' === typeof _reg && 'string' === typeof _string){
                return _string.replace(eval('/' + _reg +  '/gi'), _value);
            }
            return _value;
        }
    };

    //日期个性化范围
    $.FORMAT_FINAL = {
        YEAR : '年',
        MONTH : '月',
        WEEK : '周',
        DAY : '日',
        HOUR : '小时',
        MINUTE : '分钟',
        SECOND : '秒'
    };

    /**
     * 时间戳转换日期 格式化
     * @param _timestamp    时间戳
     * @param _format       格式化字符YYYY/MM/DD HH:ii:ss
     * @param options       参数(可不传)
     * @returns {string}
     */
    $.formatDate = function(_timestamp, _format, options){
        var isStringDate = false;           //是否个性化格式化 日期区间
        if('undefined' === typeof _timestamp || '' == $.trim(_timestamp) || isNaN(parseInt(_timestamp)) || parseInt(_timestamp) < 0) return '';
        //判断是否个性化日期
        if('boolean' === typeof _format) isStringDate = _format;
        var param = {
            _formatArr : {"year" : "YYYY", "year2" : "YY", "month" : "MM", "day" : "DD", "hour" : "HH", "minute" : "ii", "second" : "ss" },
            _limit : $.FORMAT_FINAL.YEAR                //个性化 范围 默认年
        },  matchObj = {
            _second : _defineDate._second,
            _minute : _defineDate._minute,
            _hour : _defineDate._hour,
            _day : _defineDate._day,
            _current : _defineDate._current,
            getFinalIndex : _defineDate.getFinalIndex,
            getFullMonthDay : _defineDate.getFullMonthDay,
            replaceStr : _defineDate.replaceStr
        };
        //参数合并
        if('object' === typeof options){
            param = $.extend(param, options);
            //判断常量值是否有效
            param._limit = _defineDate.getFinalIndex(param._limit) == -1 ? $.FORMAT_FINAL.YEAR : param._limit;
            //判断日期格式化
            _format = 'string' === typeof param._format ? param._format : _format;
        }

        _format = verifyFormatStr(_format);         //校验格式化字符

        /**
         * 获取替换格式
         * @param _reg
         * @param _value
         */
        function getRegFormatVal(_reg, _value){
            if(_value.toString().length < 2) _value = '0' + _value;
            _format = _defineDate.replaceStr(_reg, _format, _value);
        }

        /**
         * 过滤个性个内容
         * @param _value
         * @param _date
         * @returns {*}
         */
        function filterStringDate(_value, _date){
            var _match = '', lastValue = _value;
            if('undefined' !== typeof param._filter && $.isArray(param._filter)){
                $.each(param._filter, function(k, v){
                    //name start
                    if('string' === typeof v.name){
                        //如果匹配match为函数，则执行内部操作
                        if(('function' === typeof v.match)) {
                            v = $.extend(v, matchObj);      //追加数据操作功能
                            v.match = v.match(_date);
                        }
                        if(('string' === typeof v.match)){
                            v.match = eval('/' + v.match + '/gi');  //转换为正则
                            _match = _value.match(v.match);
                            if(null != _match && _match.length > 0){
                                lastValue = _value.replace(_match[0], v.name);
                            }
                            //end
                        }
                    }
                    //name end
                });
            }
            return lastValue;
        }

        !(function(_date){
            //区间格式化
            if(isStringDate){
                var _tmp = _defineDate.getStringDate(_date, param._limit);
                if('string' === typeof _tmp && -1 != _tmp){
                    _format = filterStringDate(_tmp, _date);
                    return;
                }
            }

            getRegFormatVal(param._formatArr.year, _date.getFullYear());
            getRegFormatVal(param._formatArr.year2, _date.getFullYear().toString().substr(2));
            getRegFormatVal(param._formatArr.month, (_date.getMonth() + 1));
            getRegFormatVal(param._formatArr.day, _date.getDate());
            getRegFormatVal(param._formatArr.hour, _date.getHours());
            getRegFormatVal(param._formatArr.minute, _date.getMinutes());
            getRegFormatVal(param._formatArr.second, _date.getSeconds());
        })((function(_date){
            return _date.getFullYear() == 1970 && (new Date(parseInt(_timestamp) * 1000)) || _date;
        })(new Date(parseInt(_timestamp))));
        return _format;
    };

    /* - - - - - - - - - - - - 分类页  - - - - - - - - - - - - */
    //分页类 全局变量
    var _global = {
        wrap : 'div.mui-pages',             //容器
        mainWrap : 'div.mui-page.mui-main-left',       //默认主页
        className : {
            transitioning : 'mui-transitioning',       //页面滑动动画
            leftShow : 'mui-page-left',                 //左侧显示
            leftHide : 'mui-hide-left',                  //右向左滑动隐藏
            itemShow : 'mui-page-right'                 //子页显示
        },
        triggerData : '[data-page=true][data-target]'        //触发节点
    };
    //分页类
    function Pages(_options){
        var _wrapBox = $(_global.wrap), _mainBox = $(_global.mainWrap), _target;

        _options = $.extend({
            callback : function(){}
        }, _options);

        //触发事件
        _wrapBox.on('tap', _global.triggerData, function(){
            _target = $($(this).data('target'));
            if('object' === typeof _target){
                $('html, body').stop(!0, !0).animate({'scrollTop' : 0}, 0);
                _mainBox.addClass(_global.className.transitioning).delay(200).addClass(_global.className.leftHide);
                _target.addClass(_global.className.transitioning).delay(200).addClass(_global.className.leftShow);
                if('function' === typeof _options.callback) _options.callback(this);
            }
        });

        this.backPage = function(){
            _mainBox.removeClass(_global.className.leftHide);
            _target.removeClass(_global.className.leftShow);
        }
    }

    //
    $.pages = function(_options) {
        return new Pages(_options);
    };

    /* - - - - - - - - - - - - 弹框 - - - - - - - - - - - - */
    var _dialog = {
        param : function(){
            return {
                wrapClass : 'defined-dialog',           //弹框区域
                watermarkClass : 'watermark',           //水印
                bodyClass : 'model-body',               //内容区域
                bodyTitleClass : 'model-title',         //标题区域
                titleCloseClass : 'model-close',        //关闭按钮
                contentClass : 'model-content',          //填充内容容器
                title : '提示信息',
                content : 'Please enter the display content',
                opacity : 0.5,
                closeCallback : function(){},           //关闭后执行
                loadHtml : function(){}                 //html加载完成后执行
            }
        }
    };

    /**
     * 类
     * @param _opt
     * @constructor
     */
    function DialogClass(_opt){
        var _body = $('body'),
            _objects = {},          //对象集
            _options = $.extend(_dialog.param(), _opt);

        //初始化弹框 架构
        function initial(){
            _objects['wrap'] = $('<div />').addClass(_options.wrapClass);                   //创建容器
            _objects['watermark'] = $('<div />').addClass(_options.watermarkClass).css({
                'background-color' : 'rgba(0, 0, 0, '+ _options.opacity +')'
            });         //透明背景
            _objects['body'] = $('<div />').addClass(_options.bodyClass);                   //弹框容器
            _objects['modelTitle'] = $('<div />').addClass(_options.bodyTitleClass);        //弹框标题容器
            _objects['titleClose'] = $('<div />').addClass(_options.titleCloseClass);       //关闭按钮
            _objects['titleText'] = $('<h3 />').text(_options.title);
            _objects['content'] = $('<div />').addClass(_options.contentClass);             //内容区域

            _objects.content.html(_options.content);            //添加默认内容

            //结构组合
            _objects.wrap.append(_objects.watermark);
            _objects.wrap.append(_objects.body);

            _objects.body.append(_objects.modelTitle);
            _objects.body.append(_objects.content);

            _objects.modelTitle.append(_objects.titleText);
            _objects.modelTitle.append(_objects.titleClose);

            _objects.wrap.hide();               //先隐藏
            loadEvent();                        //加载事件

            if('function' === typeof _options.loadHtml) _options.loadHtml(_objects.content);
        }

        //计算调试
        function setPosition(){
            var _bodyHeight = _objects.body.outerHeight(),
                _top = - (_bodyHeight / 2),
                _winHeight = $(window).height(),
                _param = {
                    'position' : 'absolute',
                    'top' : '50%',
                    'margin-top' : _top + 'px'
                };

            if(_bodyHeight >= _winHeight){
                _param['top'] = 10;
                _param['margin-top'] = 0;

                _objects.content.css({
                    'height' : _winHeight - _objects.modelTitle.outerHeight() - 20,
                    'overflow-y' : 'auto'
                })
            }

            _objects.body.css(_param);
        }

        //加载事件
        function loadEvent(){
            /**/

            //关闭事件
            _objects.titleClose.on('click', function(){
                closeDialog();
            });
        }

        //显示弹框
        function showDialog(){
            _body.append(_objects.wrap);        //添加在dom树中
            _objects.wrap.show(function(){
                setTimeout(function(){
                    _objects.watermark.addClass('showIn');

                    setTimeout(function(){
                        _objects.body.addClass('showIn');
                        setTimeout(setPosition, 50);        //重置位置
                    }, 450);
                }, 50);
            });
        }

        //关闭弹框
        function closeDialog(){
            _objects.body.addClass('hideOut');
            setTimeout(function(){
                _objects.watermark.removeClass('showIn');

                setTimeout(function(){
                    _objects.watermark.removeClass('showIn');
                    _objects.body.removeClass('showIn');

                    setTimeout(function(){
                        _objects.wrap.hide().detach();
                        _objects.body.removeClass('hideOut');
                        if('function' === typeof _options.closeCallback) _options.closeCallback(_objects.body);
                    }, 300)
                }, 20);
            }, 150);
        }

        //添加html
        function setHtml(_opt){
            _options = $.extend(_dialog.param(), _opt);
            initial();                          //调用初始化函数
        }

        initial();                          //调用初始化函数

        this.wrapper = _objects;
        this.setHtml = setHtml;
        this.showDialog = showDialog;
        this.closeDialog = closeDialog;
    }

    //
    $.definedDialog = function(_opt){
        return new DialogClass(_opt);
    };

})(jQuery);